﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccessComponents;
using DAL;
using System.Collections.ObjectModel;

namespace BusinessLogicLayer
{
    public class MiastoBL : IBusinessLogicLayer<Miasto>
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funkcja dodawająca miasto do bazy danych
        /// </summary>
        /// <param name="objDodaj">Obiekt Miasto</param>
        /// <returns></returns>
        public int dodaj(Miasto objDodaj)
        {
            GaleriaBL galeriaBL = new GaleriaBL();
            int idGaleria = galeriaBL.dodaj(objDodaj.Galeria);
            objDodaj.Id_galeria = idGaleria;
            return dal.dodajMiasto(objDodaj);
        }

        /// <summary>
        /// Funkcja usuwająca miasto z bazy danych
        /// </summary>
        /// <param name="idusun">Id miasto do usunięcia</param>
        public void usun(int idusun)
        {
            Miasto miasto = this.pobierz(idusun);

            // Usuwanie miasta
            dal.usunMiasto(idusun);
            // Usuwanie galerii powiązanej z miastem oraz zdjec znajdujących się galerii
            Galeria_ZdjeciaBL gzBL = new Galeria_ZdjeciaBL();
            gzBL.usun(miasto.Id_galeria);

            GaleriaBL galeriaBL = new GaleriaBL();
            galeriaBL.usun(miasto.Id_galeria);          

            
        }

        /// <summary>
        /// Funkcja akutualizująca miasto w bazie danych
        /// </summary>
        /// <param name="objAktualizuj">Obiekt miasto zawierający inforamacje do aktualizacji</param>
        public void aktualizuj(Miasto objAktualizuj)
        {
            dal.aktualizujMiasto(objAktualizuj);
            //Aktulizowanie informacji o galerii
            GaleriaBL galeriaBL = new GaleriaBL();
            galeriaBL.aktualizuj(objAktualizuj.Galeria);

            //Aktulizowanie informacji o kraju
            KrajBL krajBL = new KrajBL();
            krajBL.aktualizuj(objAktualizuj.Kraj);
        }

        /// <summary>
        /// Pobiera miasto na podstawie id miasto
        /// </summary>
        /// <param name="idusun">Id miasto</param>
        /// <returns>Obiekt Miasto</returns>
        public Miasto pobierz(int idpobierz)
        {
            Miasto miasto = dal.pobierzMiasto(idpobierz);

            //pobranie inforamcji o galerii hotelu
            GaleriaBL galeriaBL = new GaleriaBL();
            miasto.Galeria = galeriaBL.pobierz(miasto.Id_galeria);

            KrajBL krajBL = new KrajBL();
            miasto.Kraj = krajBL.pobierz(miasto.Id_kraju);

            //pobieranie zdjecie głowne            
            miasto.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(miasto.Id_galeria).Id_zdjecia;

            return miasto;
        }

        /// <summary>
        /// Funkcja zwraca listę wszystkich miast
        /// </summary>
        /// <returns></returns>
        public ObservableCollection<Miasto> pobierzListe()
        {
            ObservableCollection<Miasto> tmp = dal.pobierzListeMiasto();
            KrajBL krajBL = new KrajBL();
            GaleriaBL galeriaBL = new GaleriaBL();
          
            foreach (Miasto miasto in tmp)
            {

                miasto.Kraj = krajBL.pobierz(miasto.Id_kraju);
                //pobranie inforamcji o galerii miasta                
                miasto.Galeria = galeriaBL.pobierz(miasto.Id_galeria);
                //pobieranie zdjecie głowne                
                miasto.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(miasto.Id_galeria).Id_zdjecia;
            }
            return tmp;
        }

        /// <summary>
        /// Funkcja zwraca listę miast w kraju o podanym id
        /// </summary>
        /// <param name="idkraj">Id kraju</param>
        /// <returns></returns>
        public ObservableCollection<Miasto> pobierzListe(int idkraj)
        {
            ObservableCollection<Miasto> tmp = dal.pobierzListeMiasto(idkraj);
            KrajBL krajBL = new KrajBL();
            GaleriaBL galeriaBL = new GaleriaBL();
            foreach (Miasto miasto in tmp)
            {

                miasto.Kraj = krajBL.pobierz(miasto.Id_kraju);
                //pobranie inforamcji o galerii miasta                
                miasto.Galeria = galeriaBL.pobierz(miasto.Id_galeria);
                //pobieranie zdjecie głowne           
                miasto.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(miasto.Id_galeria).Id_zdjecia;
             
            }
            return tmp;
        }


        /// <summary>
        /// Funkcja aktualizująca Miasta, gdy danego miasta niema w bazie zostaje ono dodane
        /// </summary>
        /// <param name="lista"></param>
        /// <returns></returns>
        public bool aktualizujListe(ObservableCollection<Miasto> lista)
        {
            
            foreach (Miasto miasto in lista)
            {
                if (miasto.Id_miasta == 0)
                {
                    this.dodaj(miasto);
                }else
                    this.aktualizuj(miasto);
            }
            return true;
        }

        public bool usun(ObservableCollection<Miasto> lista)
        {
            foreach (Miasto miasto in lista)
            {
                // dodać obsługe błędu, np  gdy miasto jest już użyte
                this.usun(miasto.Id_miasta);
            }
            return true;
        }
    }
}
